import asyncio
import datetime
import json
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.enums import ParseMode
# импорт фильтров команд для бота
from aiogram.filters.command import Command
# импорт свойств бота по умолчанию
from aiogram.client.default import DefaultBotProperties
# импорт спец.методов форматирования из aiogram
from aiogram.utils.markdown import hbold, hlink
# импорт фильтра F для обработки нажатий кнопок клавиатуры
from aiogram import F
# из файла конфигурации импортируем токен бота
from config import TOKEN
from news_scrap import check_news_update


# Включаем логгирование, чтобы не пропустить важные сообщения
logging.basicConfig(level=logging.INFO)
# создаём объект бота
bot = Bot(token=TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
# создаём объект диспетчера для управления ботом
dp = Dispatcher()


# создадим обработчик команды /start
@dp.message(Command("start"))
async def start(message: types.Message):
    # добавим клавиатуру для бота
    # создадим список кнопок
    kb = [
        [types.KeyboardButton(text="Все новости")],
        [types.KeyboardButton(text="Последние 5 новостей")],
        [types.KeyboardButton(text="Свежие новости")]
    ]
    # создадим объект клавиатуры
    keyboard = types.ReplyKeyboardMarkup(keyboard=kb, resize_keyboard=True)
    # отправим пользователю сообщение с клавиатурой
    await message.answer("Лента новостей", reply_markup=keyboard)


# обработчик команды получения всех новостей
@dp.message(F.text == "Все новости")
async def get_all_news(message: types.Message):
    # подгружаем словарь с новостями из JSON-файла
    with open("news_dict.json", encoding="utf-8") as file:
        news_dict = json.load(file)
        # отсортируем список новостей, полученных из файла
        for k, v in sorted(news_dict.items()):
            news = f"{hbold(datetime.datetime.fromtimestamp(
                     v['article_date_timestamp']))} \n" \
                   f"{hlink(v['article_title'], v['article_url'])}"
            # отправляем ответ пользователю
            await message.answer(news)


# обработчик получения 5-ти последних новостей
@dp.message(F.text == "Последние 5 новостей")
async def get_last_five_news(message: types.Message):
    with open("news_dict.json", encoding="utf-8") as file:
        news_dict = json.load(file)
    for k, v in sorted(news_dict.items())[-5:]:
        news = f"{hbold(datetime.datetime.fromtimestamp(
            v['article_date_timestamp']))} \n" \
               f"{hlink(v['article_title'], v['article_url'])}"
        await message.answer(news)


# обработчик команды "Свежие новости"
@dp.message(F.text == "Свежие новости")
async def get_fresh_news(message: types.Message):
    fresh_news = check_news_update()
    # если словарь fresh_news содержит хотя бы одну запись,
    # то его длина будет больше или равна 1
    if len(fresh_news) >= 1:
        # отдаём все новости пользователю
        for k, v in sorted(fresh_news.items()):
            news = f"{hbold(datetime.datetime.fromtimestamp(
                v['article_date_timestamp']))} \n" \
                   f"{hlink(v['article_title'], v['article_url'])}"
            await message.answer(news)
    else:
        # иначе выведем соответствующее сообщение
        await message.answer("Пока нет свежих новостей...")

# основная функция
async def main():
    await dp.start_polling(bot)


if __name__ == '__main__':
    asyncio.run(main())